package boot

import (
	"dc-go/global"
	"dc-go/model"
	"fmt"
	"os"
	"regexp"

	"go.uber.org/zap"
	"gorm.io/gorm"
)

func Migrate(db *gorm.DB) {

	db.SetupJoinTable(&model.SysRole{}, "Org", &model.SysOrgRole{})
	db.SetupJoinTable(&model.SysOrg{}, "Role", &model.SysOrgRole{})

	db.SetupJoinTable(&model.SysUser{}, "OrgRole", &model.SysUserOrgRole{})
	db.SetupJoinTable(&model.SysOrgRole{}, "User", &model.SysUserOrgRole{})

	db.SetupJoinTable(&model.SysMenu{}, "Role", &model.SysRoleMenu{})
	db.SetupJoinTable(&model.SysRole{}, "Menu", &model.SysRoleMenu{})

	db.SetupJoinTable(&model.SysSql{}, "Sqlparam", &model.SysSqlparam{})
	db.SetupJoinTable(&model.SysSqlparam{}, "Sql", &model.SysSqlSqlparam{})

	// err := db.AutoMigrate(migrateList...)
	// err := db.AutoMigrate(migrateNeededList...)
	err := db.AutoMigrate()

	if err != nil {
		fmt.Println("迁移数据库失败! ", zap.Any("error:", err))
		global.DcLogger.Error("迁移数据库失败! ", zap.Any("error:", err))
		os.Exit(0)
	}
	fmt.Println("迁移数据库成功! ")
	global.DcLogger.Info("迁移数据库成功! ")

	if global.DcConfig.System.NeedInitialData {
		fmt.Println("初始化数据库数据! ")
		global.DcLogger.Info("初始化数据库数据! ")
		// initialData(db)
	}

	global.DcSqlParamReg, err = regexp.Compile(`@[\w]+\b`)
	if err != nil {
		fmt.Println("初始化SQL参数匹配器失败! ", zap.Any("error:", err))
		global.DcLogger.Error("初始化SQL参数匹配器失败! ", zap.Any("error:", err))
		os.Exit(0)
	}

}

var migrateList = []interface{}{
	model.SysUser{},
	model.SysRole{},
	model.SysOrgRole{},
	model.SysUserOrgRole{},
	model.SysMenu{},
	model.SysRoleMenu{},
	model.SysApi{},
	model.SysRoleApi{},
	model.SysDict{},
	model.SysConfigBackend{},
	model.SysConfigFrontend{},
	model.SysLogLogin{},
	model.SysLogOperation{},
	model.SysUserOnline{},
	model.SysSql{},
	model.SysSqlparam{},
	model.SysSqlSqlparam{},
}

var migrateNeededList = []interface{}{
	model.SysMenu{},
	model.SysSql{},
	model.SysSqlparam{},
	model.SysSqlparamOption{},
}
